#include <iostream>
#include <unistd.h>
#include <cassert>
#include <signal.h>
#include <cstring>

using namespace std;


void ShowPending(sigset_t pending)
{
    cout << "当前进程: " << getpid() << "的pending位图: ";
    for(int signo = 31; signo >= 1; signo--)
    {
        if(sigismember(&pending, signo)) cout << "1";
        else cout << "0";
    }
    cout << "\n";
}

void handler(int signo)
{
    cout << "对特定信号："<< signo << "执行捕捉动作" << endl;

    // sigset_t pending;
    // int n = sigpending(&pending);
    // assert(n != -1);
    // (void)n;

    // ShowPending(pending);
    // //说明了pending位图在执行自定义的信号处理方法之前就已经被恢复了
    // exit(-1);

    int cnt = 20;
    while(cnt)
    {
        cnt--;
        sigset_t pending;
        sigpending(&pending);
        ShowPending(pending);
        sleep(1);
    }

}

void show(int signo)
{
    cout << "3333333333"<< endl;
}

int main()
{

    signal(3, show);

    //signaction的讲解
    struct sigaction act, oldact;
    memset(&act, 0, sizeof(act));
    memset(&oldact, 0, sizeof(oldact));
    //主要关注一下两个成员
    act.sa_flags = 0;
    act.sa_handler = handler;

    sigemptyset(&act.sa_mask);
    //在处理2好信号的同时，屏蔽3 4 5信号
    sigaddset(&act.sa_mask, 3);
    sigaddset(&act.sa_mask, 4);
    sigaddset(&act.sa_mask, 5);

    sigaction(2, &act, &oldact);

    while(true)
    {
        cout << getpid() << endl;;
        sleep(1);
    }



    // sigset_t set, oset;
    // sigemptyset(&set);
    // sigemptyset(&oset);
    // //将2号信号阻塞，注意并不是所有的信号都可以被阻塞的，比如9号信号
    // sigaddset(&set, 2);
    // //将新的信号屏蔽字设置进程
    // sigprocmask(SIG_BLOCK, &set, &oset);

    // signal(2, handler);
    // int cnt = 0;
    // while(true)
    // {
    //     cout << "pending table: " << endl << "\t";
    //     //获取pending信号集
    //     sigset_t pending;
    //     int n = sigpending(&pending);//输出型参数
    //     if(n == -1)
    //     {
    //         exit(-1);
    //     }

    //     ShowPending(pending);

    //     //6秒之后再恢复所有信号的block
    //     if(cnt == 6)
    //     {
    //         cout << "解除对2号信号的屏蔽" << endl; //先打印
    //         sigprocmask(SIG_SETMASK, &oset, nullptr);
    //     }
    //     cnt++;
    //     sleep(1);
    // }

    return 0;
}